#!/usr/bin/perl
#
#
# For the addition of future services just add a variable $groupname? and then
# call the functions &delete_entry($groupname?,$username);
# where ? is a unique number.
#
#
#

use Fcntl qw(:flock);

# check arguments

if ( ($#ARGV <0) || (($#ARGV+1)>=2 ) )
{
  print <<FNUSAGETEXT;
usage : rmcremoveuser <user> 

FNUSAGETEXT
exit 1;
}

$groupname1="IBM\.ServiceEvent";
$groupname2="IBM\.Sfp";
$groupname3="IBM\.LparCmd";
$username=$ARGV[0];
$username.="\@LOCALHOST";
$delcnt=0;

#File location variables
$local_acls_file="\/var\/ct\/cfg\/ctrmc.acls";
$temp_acls_file="\/tmp\/temp_acls";
$temp_local_acls_file="\/var\/ct\/cfg\/ctrmc.acls.temp";

################################
# Main
################################
# If the acls file does not exist or of zero in length the 
# print error message and exit

if (! -s $local_acls_file)
{
   print "The file $local_acls_file does not exist or it is of zero bytes\n";
   exit 1;
}
#open acls and temp_acls files and lock it 
if (!open(ACLS,"+<$local_acls_file"))
{
 print "Can't open $local_acls_file file :$!\n";
 exit 1;
}
for ($i=0;$i<3;$i++)
{
 if ($i>0)
 {
   if (!open(ACLS,"+<$local_acls_file"))
   {
     print "Can't open $local_acls_file file :$!\n";
     exit 1;
   }
 }
 if (!flock(ACLS,LOCK_EX|LOCK_NB))
 {
   if ($i==2)
   {
     print "Can't lock the file Handle ACLS:$!\n";
     close ACLS;
     exit 3;
   }
   else
   {
     close ACLS;
     sleep 2;
   }
 }
 else
 {
   last ;
 }
}

&delete_entry($groupname1,$username, *ACLS);
&delete_entry($groupname2,$username, *ACLS);
&delete_entry($groupname3,$username, *ACLS);
close ACLS;

if ($delcnt==0)
{
  print "The  entry $NodeName is not found under the service $groupname in the $local_acls_file file\n";
exit 0;
}


###############################
# Sub routines
###############################

sub delete_entry
{

  local ($groupname, $usrname, *ACLSFILEHDL) = @_;

  if (!open(TEMP,"+>$temp_acls_file"))
  {
    print "Can't create $temp_acls_file file :$!\n";
    system ("cp $temp_local_acls_file $local_acls_file");
    close ACLSFILEHDL;
    exit 2;
  }
  if (!flock(TEMP,LOCK_EX|LOCK_NB))
  {
    print "Can't lock the file Handle TEMP:$!\n";
    system ("cp $temp_local_acls_file $local_acls_file");
    close ACLSFILEHDL;
    exit 4;
  }

  my $entry_cnt=0;
  $entry_cnt=&chsck_cnt($groupname, $usrname);
  $grpflg=0;
  seek (ACLSFILEHDL,0,0);
  while(<ACLSFILEHDL>)
  {
    if (/^IBM/)
    {
      if (/^$groupname/)
      {
         $grpflg=1
      }
      else
      {
        $grpflg=0
      } 
    }
    if ($grpflg==1)
    {
      if (/[ \t]$usrname+[ \t]/)
      {
        $delcnt=$delcnt+1;
      }
      else
      {
        print TEMP;
      } 
    }
    else
    {
      print TEMP;
    }
  }
  system("cp $temp_acls_file $local_acls_file");
  close TEMP;
  system("rm -f $temp_acls_file");
  if  ($entry_cnt < 1)
  {
    
    if (!open(TEMP,"+>$temp_acls_file"))
    {
      print "Can't create $temp_acls_file file :$!\n";
      system ("cp $temp_local_acls_file $local_acls_file");
      close ACLSFILEHDL;
      exit 2;
    }
    if (!flock(TEMP,LOCK_EX|LOCK_NB))
    {
       print "Can't lock the file Handle TEMP:$!\n";
       system ("cp $temp_local_acls_file $local_acls_file");
       close ACLSFILEHDL;
       exit 4;
    }
    seek (ACLSFILEHDL,0,0);
    while(<ACLSFILEHDL>)
    {
       if (/^IBM/)
       {
          if (/^$groupname/)
          {
          }
          else
          {
             print TEMP;
          } 
       }
       else
       {
         print TEMP;
       }
     } 
   system("cp $temp_acls_file $local_acls_file");
   close TEMP;
   system("rm -f $temp_acls_file");
  }
 
}
sub chsck_cnt
{
  local ($grpname, $urname) = @_;
  my $cnt=1;
  $gpflg=0;
  seek (ACLSFILEHDL,0,0);
  while(<ACLSFILEHDL>)
  {
    if (/^IBM/)
    {
       if (/^$grpname/)
       {
         $gpflg=1
       }
       else
       {
          $gpflg=0
       } 
    }
    if ($gpflg==1)
    {
      if (/[ \t]$urname+[ \t]/)
      {
        $cnt=$cnt-1;
      }
      else
      {
        if ( (/^IBM/) || (/^$/) )
        {
        }
        else
        {
          $cnt=$cnt+1;
        }
      } 
    }
    else
    {
    }
  }
 return $cnt;

} 
